package com.chentf.spring.annotation.service;

import com.chentf.spring.annotation.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.inject.Inject;

@Service
public class BookService {
    // 当为@Autowired注解添加属性required=false后，即使IOC容器中没有对应的对象，Spring也不会抛出异常了。不过，此时装配的对象就为null了
    //@Autowired(required = false)
    // 使用了@Qualifier注解显示指定了@Autowired注解装配bookDao对象
    //@Qualifier("bookDao")
    /**
     * @Resource注解既可以通过name属性指定注入对象的名称，也可以通过type属性指定注入对象的类型。如果两者都指定了，则优先使用name属性指定的名称进行注入
     * @Resource注解和@Autowired注解的功能是一样的，都能实现自动装配，只不过@Resource注解默认是按照组件名称（即属性的名称）进行装配的。虽然@Resource注解具备自动装配这一功能，
     * 但是它是不支持@Primary注解优先注入的功能的，而且也不能像@Autowired注解一样能添加required=false属性。
     */
    //@Resource(name="bookDao2")
    // @Inject注解和@Autowired注解的功能是一样的，都能实现自动装配，而且它俩都支持@Primary注解优先注入的功能。只不过，@Inject注解不能像@Autowired注解一样能添加required=false属性，因为它里面没啥属性。
    @Inject
    private BookDao bookDao;

    public void print() {
        System.out.println(bookDao);
    }

    @Override
    public String toString() {
        return "BookService{" +
                "bookDao=" + bookDao +
                '}';
    }
    /**
     * @Resource和@Inject这俩注解与@Autowired注解的区别
     * 不同点
     *  @Autowired是Spring中的专有注解，而@Resource是Java中JSR250规范里面定义的一个注解，@Inject是Java中JSR330规范里面定义的一个注解
     *  @Autowired支持参数required=false，而@Resource和@Inject都不支持
     *  @Autowired和@Inject支持@Primary注解优先注入，而@Resource不支持
     *  @Autowired通过@Qualifier指定注入特定bean，@Resource可以通过参数name指定注入bean，而@Inject需要通过@Named注解指定注入bean
     */
}
